package com.jsb.laundry.common.utils.sf;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.jsb.laundry.common.constant.JSBSpecialID;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 顺丰不同服务msgData构建
 *
 * @data 2023/4/13 14:13
 */
public class SFMsgDataBuilder {
    /**
     * 下单 msgData
     *
     * @param payId
     * @param userInfo       发货方
     * @param factoryInfoDto 收货方
     * @param type           0:往工厂发货，1：工厂寄出
     * @param num            包裹数
     * @return
     */
    public static String getCreateOrderMsgData(String payId, UserInfoDto userInfo, FactoryInfoDto factoryInfoDto, String type, int num) {
        JSONObject orderInfo = new JSONObject();
        orderInfo.put("orderId", payId);
        orderInfo.put("language", "zh-CN");

        if ("0".equals(type)) {
            orderInfo.put("payMethod", 2);//付款方式，支持以下值： 1:寄方付 2:收方付 3:第三方付
            // 处理月卡快递付费情况
            if (!userInfo.getBuyCouponEd() && (JSBSpecialID.JSB_MONTH_1_298.equals(userInfo.getGoodsId())
                    || JSBSpecialID.JSB_MONTH_2_398.equals(userInfo.getGoodsId()))) { //用户 没 购买过优惠券由公司承担运费
                orderInfo.put("payMethod", 1);//付款方式，支持以下值： 1:寄方付 2:收方付 3:第三方付
            }
        } else {
            orderInfo.put("payMethod", 1);//付款方式，支持以下值： 1:寄方付 2:收方付 3:第三方付
            // 处理月卡快递付费情况
            if (!userInfo.getBuyCouponEd() && (JSBSpecialID.JSB_MONTH_1_298.equals(userInfo.getGoodsId())
                    || JSBSpecialID.JSB_MONTH_2_398.equals(userInfo.getGoodsId()))) { //用户 没 购买过优惠券由公司承担运费
                orderInfo.put("payMethod", 2);//付款方式，支持以下值： 1:寄方付 2:收方付 3:第三方付
            }
        }

        orderInfo.put("parcelQty", num);//包裹数，一个包裹对应一个运单号；若包裹数大于1，则返回一个母运单号和N-1个子运单号
        //默认上门预约时间
        Date defaultAppointmentTime = defaultDateAdd45Min();

        if ("0".equals(type)) {
            orderInfo.put("sendStartTm", userInfo.getAppointmentTime() == null ? defaultAppointmentTime : userInfo.getAppointmentTime());//上门取件时间
        } else {
            orderInfo.put("sendStartTm", factoryInfoDto.getAppointmentTime() == null ? defaultAppointmentTime : factoryInfoDto.getAppointmentTime());//上门取件时间
        }
        orderInfo.put("isDocall", "1");//是否通过手持终端 通知顺丰收派 员上门收件，支持以下值： 1：要求 0：不要求

//        orderInfo.put("monthlyCard", "0210887496");//顺丰月结卡号 月结支付时传值，现结不需传值；沙箱联调可使用测试月结卡号7551234567（非正式，无须绑定，仅支持联调使用）

        //TODO 托寄物信息
        JSONArray cargoDetails = new JSONArray();
        JSONObject obj1 = new JSONObject();
        obj1.put("name", "聚洗衣商品"); //货物名称
//        obj1.put("count", 3);         //货物数量
//        obj1.put("unit", "个");       //货物单位，如：个、台、本 跨境件报关需要填写
//        obj1.put("weight", 6.325);    //订单货物单位重量，包含子母件， 单位千克，精确到小数点后3位
//        obj1.put("amount", 12.562);   //货物单价，精确到小数点后3位
        obj1.put("currency", "CNY");   //货物单价的币别
        obj1.put("sourceArea", "CHN"); //原产地国别
        cargoDetails.add(obj1);
        orderInfo.put("cargoDetails", cargoDetails);

        //TODO 收寄双方信息
        JSONArray contactInfoList = new JSONArray();
        //用户地址信息(寄件方信息)
        JSONObject obj2 = new JSONObject();
        if ("0".equals(type)) {
            obj2.put("contactType", 1); //地址类型： 1，寄件方信息 2，到件方信息
        } else {
            obj2.put("contactType", 2); //地址类型： 1，寄件方信息 2，到件方信息
        }
        obj2.put("address", userInfo.getUserAddress());  //联系人住址
        obj2.put("contact", userInfo.getUserName()); //联系人姓名
        obj2.put("tel", userInfo.getUserPhone()); //联系电话
        obj2.put("country", "CN");

        //工厂地址信息(收件方信息)
        JSONObject obj3 = new JSONObject();
        if ("0".equals(type)) {
            obj3.put("contactType", 2); //地址类型： 1，寄件方信息 2，到件方信息
        } else {
            obj3.put("contactType", 1); //地址类型： 1，寄件方信息 2，到件方信息
        }
        obj3.put("address", factoryInfoDto.getFactoryAddress());  //联系人住址
        obj3.put("contact", factoryInfoDto.getFactoryName()); //联系人姓名
        obj3.put("tel", factoryInfoDto.getFactoryPhone()); //联系电话
        obj3.put("country", "CN");
        contactInfoList.add(obj2);
        contactInfoList.add(obj3);
        orderInfo.put("contactInfoList", contactInfoList);

        return JSON.toJSONString(orderInfo);
    }

    /**
     * 默认上门预约时间为当前时间加45分钟
     * @return
     */
    public static Date defaultDateAdd45Min() {
        // 获取当前时间、加上 45 分钟
        LocalDateTime currentTime = LocalDateTime.now().plusMinutes(45);
        //获取系统默认时区 将 LocalDateTime 转换为 Date 类型
        Date date = Date.from(currentTime.atZone(ZoneId.systemDefault()).toInstant());
        return date;
    }

    /**
     * 取消订单
     *
     * @param payId 客户订单号
     * @return
     */
    public static String getCancelOrderMsgData(String payId) {
        JSONObject orderInfo = new JSONObject();
        orderInfo.put("orderId", payId);
        orderInfo.put("dealType", "2"); //客户订单操作标识: 1:确认 (丰桥下订单接口默认自动确认，不需客户重复确认，该操作用在其它非自动确认的场景) 2:取消
        return JSON.toJSONString(orderInfo);
    }

    /**
     * 物流轨迹查询
     */
    public static String getLogisticsTrackMsgData(List payIdList) {
        Map map = new HashMap();
        map.put("trackingType","2"); //1:根据顺丰运单号查询,2:根据客户订单号查询
        map.put("methodType","1"); //路由查询类别: 1:标准路由查询 2:定制路由查询
        map.put("trackingNumber",payIdList);
        return JSON.toJSONString(map);
    }


}
